#ifndef COLOR_CORRECTION_HPP
#define COLOR_CORRECTION_HPP

#include <opencv2/opencv.hpp>
#include <opencv2/aruco.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <nlohmann/json.hpp>
#include <iostream>
#include <vector>
#include <string>
#include <fstream>

using json = nlohmann::json;

/**
 * 颜色校正类 - 实现基于ArUco标记色卡的颜色校正
 * 包含色彩校正矩阵(CCM)计算和应用功能
 */
class ColorCorrector {
private:
    // ArUco标记ID定义
    static constexpr int TOP_LEFT_ID = 923;
    static constexpr int TOP_RIGHT_ID = 1001;
    static constexpr int BOTTOM_RIGHT_ID = 241;
    static constexpr int BOTTOM_LEFT_ID = 1007;
    
    // 色彩校正参数
    cv::Mat colorCorrectionMatrix;
    cv::Scalar meanShift;
    bool isCalibrated;
    
    // 标准色卡颜色值 (sRGB空间中的期望值)
    std::vector<cv::Vec3f> standardColors;
    
public:
    ColorCorrector();
    ~ColorCorrector() = default;
    
    /**
     * 在图像中查找ArUco标记的色卡
     * @param image 输入图像
     * @return 提取的色卡图像，如果未找到返回空Mat
     */
    cv::Mat findColorCard(const cv::Mat& image);
    
    /**
     * 四点透视变换
     * @param image 输入图像
     * @param corners 四个角点坐标
     * @return 透视变换后的图像
     */
    cv::Mat fourPointTransform(const cv::Mat& image, const std::vector<cv::Point2f>& corners);
    
    /**
     * 从色卡中提取颜色样本
     * @param colorCard 色卡图像
     * @return 提取的颜色向量
     */
    std::vector<cv::Vec3f> extractColorSamples(const cv::Mat& colorCard);
    
    /**
     * 计算色彩校正矩阵
     * @param referenceCard 参考色卡图像
     * @param inputCard 输入色卡图像
     * @return 是否成功计算校正矩阵
     */
    bool calculateColorCorrectionMatrix(const cv::Mat& referenceCard, const cv::Mat& inputCard);
    
    /**
     * 应用色彩校正到图像
     * @param image 输入图像
     * @return 校正后的图像
     */
    cv::Mat applyColorCorrection(const cv::Mat& image);
    
    /**
     * 保存校正参数到JSON文件
     * @param filename JSON文件路径
     * @return 是否成功保存
     */
    bool saveParametersToJson(const std::string& filename);
    
    /**
     * 从JSON文件加载校正参数
     * @param filename JSON文件路径
     * @return 是否成功加载
     */
    bool loadParametersFromJson(const std::string& filename);
    
    /**
     * 显示校正前后对比
     * @param original 原始图像
     * @param corrected 校正后图像
     */
    void showComparison(const cv::Mat& original, const cv::Mat& corrected);
    
    /**
     * 检查是否已校准
     * @return 校准状态
     */
    bool isCalibrationReady() const { return isCalibrated; }
};

#endif // COLOR_CORRECTION_HPP
